// 用户管理模块
#ifndef __CONN_CTL_HPP__
#define __CONN_CTL_HPP__
#include "log.hpp"
#include "webserver.hpp"
#include <unordered_map>
#include <utility>
class conn_ctl
{
    // 游戏房间和游戏广场管理
private:
    std::mutex _mutex;                                       // 上锁保护
    std::unordered_map<int, server::connection_ptr> _room;   // 房间管理
    std::unordered_map<int, server::connection_ptr> _square; // 广场管理
public:
    // 增加用户到room中
    bool add_room_id(int id, server::connection_ptr ptr)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto iter = _room.find(id);
        if (iter == _room.end())
        {
            // 没找到,就插入
            auto ret = _room.insert(make_pair(id, ptr));
            if (ret.second == false)
            {
                ("insert user error");
            }
            return true;
        }
        // 找到了，重复用户
        debug_log("user already exists _room");
        return false;
    }

    // 增加用户到square中
    bool add_square_id(int id, server::connection_ptr ptr)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto iter = _square.find(id);
        if (iter == _square.end())
        {
            // 没找到,就插入
            auto ret = _square.insert(make_pair(id, ptr));
            if (ret.second == false)
            {
                error_log("insert user error");
            }
            return true;
        }
        // 找到了，重复用户
        debug_log("user already exists _square");
        return false;
    }

    // 从room删除用户
    bool del_room_id(int id)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto iter = _room.find(id);
        if (iter == _room.end())
        {
            // 没找到,直接退出
            debug_log("user not exists");
            return false;
        }

        // 找到了,删除
        _room.erase(iter);
        return true;
    }

    // 从square删除用户
    bool del_square_id(int id)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto iter = _square.find(id);
        if (iter == _square.end())
        {
            // 没找到,直接退出
            debug_log("user not exists");
            return false;
        }

        // 找到了,删除
        _square.erase(iter);
        return true;
    }

    // 在room中找id的用户
    bool find_room_id(int id)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto iter = _room.find(id);
        if (iter == _room.end())
        {
            // 没找到,直接退出
            debug_log("user not exists");
            return false;
        }
        // 找到了
        return true;
    }

    // 在room中找id的用户
    bool find_square_id(int id)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto iter = _square.find(id);
        if (iter == _square.end())
        {
            // 没找到,直接退出
            debug_log("user not exists");
            return false;
        }
        // 找到了
        return true;
    }

    // 通过id 找到对应的 连接
    server::connection_ptr get_con_room(int id)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto it = _room.find(id);
        if (it == _room.end())
        {
            // 没找到
            debug_log("user not exists");
            return server::connection_ptr();
        }
        return it->second;
    }

    server::connection_ptr get_con_square(int id)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto it = _square.find(id);
        if (it == _square.end())
        {
            // 没找到
            debug_log("user not exists");
            return server::connection_ptr();
        }
        return it->second;
    }
};

#endif